home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Griffith 0.9.8 / griffith-0.9.8-win32.exe / {app} / lib / edit.py < prev    next >
Text File  |  2008-11-17  |  10KB  |  264 lines

  1. # -*- coding: UTF-8 -*-
  2.  
  3. __revision__ = '$Id: edit.py 1040 2008-11-15 21:13:49Z mikej06 $'
  4.  
  5. # Copyright (c) 2005-2008 Vasco Nunes, Piotr O┼╝arowski
  6.  
  7. # This program is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU Library General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program; if not, write to the Free Software
  19. # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  20.  
  21. # You may use and distribute this software under the terms of the
  22. # GNU General Public License, version 2 or later
  23.  
  24. import gutils
  25. import os
  26. import update
  27. import gtk
  28. import amazon
  29. from urllib import urlcleanup
  30. import tempfile
  31. import movie
  32. import delete
  33. from PIL import Image
  34.  
  35. def change_poster(self):
  36.     """
  37.     changes movie poster image to a custom one
  38.     showing a file chooser dialog to select it
  39.     """
  40.     picture = self.widgets['movie']['picture']
  41.     number = self.get_maintree_selection()[0]
  42.     if number is None:
  43.         gutils.error(self,_("You have no movies in your database"), self.widgets['window'])
  44.         return False
  45.     filename = gutils.file_chooser(_("Select image"), action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK), name="", folder=self.locations['desktop'], picture=True)
  46.     if filename and filename[0]:
  47.         filename = filename[0].decode('UTF-8')
  48.         update_image(self, number, filename)
  49.  
  50. def update_image(self, number, file_path):
  51.     import shutil
  52.     try:
  53.         self.widgets['movie']['picture'].set_from_pixbuf(\
  54.                 gtk.gdk.pixbuf_new_from_file(file_path).scale_simple(100, 140, gtk.gdk.INTERP_BILINEAR))
  55.     except Exception, e:
  56.         self.debug.show(str(e))
  57.         gutils.error(self, _("Image not valid."), self.widgets['window'])
  58.         return False
  59.  
  60.     filename = os.path.basename(file_path)
  61.     new_image = os.path.splitext(filename)[0]
  62.     if self.db.Movie.get_by(image=new_image) is not None:
  63.         i = 0
  64.         while True:
  65.             i += 1
  66.             if self.db.Movie.get_by(image="%s_%s" % (new_image, i)) is None:
  67.                 new_image = "%s_%s" % (new_image, i)
  68.                 break
  69.  
  70.     movie = self.db.Movie.get_by(number=number)
  71.     old_image = os.path.join(self.locations['posters'], "%s.jpg" % movie.image)
  72.     delete.delete_poster(self, old_image)
  73.     movie.image = new_image
  74.     movie.update()
  75.     movie.flush()
  76.  
  77.     shutil.copyfile(file_path, os.path.join(self.locations['posters'], "%s.jpg" % new_image))
  78.  
  79.     gutils.make_thumbnail(self, '%s.jpg' % new_image)
  80.     gutils.make_medium_image(self, '%s.jpg' % new_image)
  81.     update_tree_thumbnail(self, os.path.join(self.locations['posters'], 't_%s.jpg' % new_image))
  82.  
  83.     self.widgets['movie']['picture_button'].set_sensitive(True)
  84.     self.widgets['add']['delete_poster'].set_sensitive(True)
  85.     self.widgets['menu']['delete_poster'].set_sensitive(True)
  86.  
  87.     self.update_statusbar(_("Image has been updated"))
  88.  
  89. def delete_poster(self):
  90.     movie = self.db.Movie.get_by(movie_id=self._movie_id)
  91.     if not movie:
  92.         self.debug.show("Can't delete unknown movie's poster!")
  93.         return False
  94.     response = gutils.question(self, _("Are you sure you want to delete this poster?"), 1, self.widgets['window'])
  95.     if response==-8:
  96.         image_path = os.path.join(self.locations['images'], 'default.png')
  97.         handler = self.widgets['movie']['picture'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(image_path))
  98.         gutils.garbage(handler)
  99.         update_tree_thumbnail(self, os.path.join(self.locations['images'], 'default_thumbnail.png'))
  100.         # update in database
  101.         old_image = movie.image
  102.         movie.image = None
  103.         movie.update()
  104.         movie.flush()
  105.         self.update_statusbar(_("Image has been updated"))
  106.  
  107.         self.widgets['add']['delete_poster'].set_sensitive(False)
  108.         self.widgets['menu']['delete_poster'].set_sensitive(False)
  109.         self.widgets['movie']['picture_button'].set_sensitive(False)
  110.         if old_image:
  111.             delete.delete_poster(self, old_image)
  112.     else:
  113.         pass
  114.  
  115. def update_tree_thumbnail(self, t_image_path):
  116.     treeselection = self.widgets['treeview'].get_selection()
  117.     (tmp_model, tmp_iter) = treeselection.get_selected()
  118.     self.Image.set_from_file(t_image_path)
  119.     pixbuf = self.Image.get_pixbuf()
  120.     self.treemodel.set_value(tmp_iter, 1, pixbuf)
  121.  
  122. def fetch_bigger_poster(self):
  123.     match = 0
  124.     self.debug.show("fetching poster from amazon")
  125.     movie = self.db.Movie.get_by(movie_id=self._movie_id)
  126.     if movie is None:
  127.         gutils.error(self,_("You have no movies in your database"), self.widgets['window'])
  128.         return False
  129.     current_poster = movie.image
  130.     amazon.setLicense("04GDDMMXX8X9CJ1B22G2")
  131.  
  132.     locale = self.config.get('amazon_locale', 0, section='add')
  133.     keyword = self.widgets['movie']['o_title'].get_text().decode('utf-8')
  134.     if locale == '1':
  135.         locale = 'uk'
  136.     elif locale == '2':
  137.         locale = 'de'
  138.         keyword = self.widgets['movie']['title'].get_text().decode('utf-8')
  139.     elif locale == '3':
  140.         locale = 'ca'
  141.     elif locale == '4':
  142.         locale = 'fr'
  143.     elif locale == '5':
  144.         locale = 'jp'
  145.     else:
  146.         locale = None
  147.  
  148.     try:
  149.         result = amazon.searchByKeyword(keyword, type="Large", product_line="DVD", locale=locale)
  150.         self.debug.show("Posters found on amazon: %s posters" % result.TotalResults)
  151.     except:
  152.         gutils.warning(self, _("No posters found for this movie."))
  153.         return
  154.  
  155.     from widgets import connect_poster_signals, reconnect_add_signals
  156.     connect_poster_signals(self, get_poster_select_dc, result, current_poster)
  157.  
  158.     if not len(result.Item):
  159.         gutils.warning(self, _("No posters found for this movie."))
  160.         reconnect_add_signals(self)
  161.         return
  162.  
  163.     for f in range(len(result.Item)):
  164.         if self.widgets['movie']['o_title'].get_text().decode('utf-8') == result.Item[f].ItemAttributes.Title:
  165.             get_poster(self, f, result, current_poster)
  166.             return
  167.  
  168.     self.treemodel_results.clear()
  169.     self.widgets['add']['b_get_from_web'].set_sensitive(False) # disable movie plugins (result window is shared)
  170.  
  171.     for f in range(len(result.Item)):
  172.         if hasattr(result.Item[f], "LargeImage") and len(result.Item[f].LargeImage.URL):
  173.             title = result.Item[f].ItemAttributes.Title
  174.             myiter = self.treemodel_results.insert_before(None, None)
  175.             self.treemodel_results.set_value(myiter, 0, str(f))
  176.             self.treemodel_results.set_value(myiter, 1, title)
  177.  
  178.     self.widgets['results']['window'].show()
  179.     self.widgets['results']['window'].set_keep_above(True)
  180.  
  181. def get_poster_select_dc(self, event, mself, result, current_poster):
  182.     if event.type == gtk.gdk._2BUTTON_PRESS:
  183.         get_poster(mself, None, result, current_poster)
  184.  
  185. def get_poster_select(self, mself, result, current_poster):
  186.     get_poster(mself, None, result, current_poster)
  187.  
  188. def get_poster(self, f, result, current_poster):
  189.     from widgets import reconnect_add_signals
  190.     if f is None:
  191.         treeselection = self.widgets['results']['treeview'].get_selection()
  192.         (tmp_model, tmp_iter) = treeselection.get_selected()
  193.         if tmp_iter is None:
  194.             return False
  195.         f = int(tmp_model.get_value(tmp_iter, 0))
  196.         self.widgets['results']['window'].hide()
  197.  
  198.     file_to_copy = tempfile.mktemp(suffix=self.widgets['movie']['number'].get_text().decode('utf-8'), \
  199.         dir=self.locations['temp'])
  200.     file_to_copy += ".jpg"
  201.     if len(result.Item[f].LargeImage.URL):
  202.         try:
  203.             progress = movie.Progress(self.widgets['window'],_("Fetching poster"),_("Wait a moment"))
  204.             retriever = movie.Retriever(result.Item[f].LargeImage.URL, self.widgets['window'], progress, file_to_copy)
  205.             retriever.start()
  206.             while retriever.isAlive():
  207.                 progress.pulse()
  208.                 if progress.status:
  209.                     retriever.suspend()
  210.                 while gtk.events_pending():
  211.                     gtk.main_iteration()
  212.             progress.close()
  213.             urlcleanup()
  214.         except:
  215.             gutils.warning(self, _("Sorry. A connection error has occurred."))
  216.  
  217.     if  os.path.isfile(file_to_copy):
  218.         try:
  219.             im = Image.open(file_to_copy)
  220.         except IOError:
  221.             self.debug.show("failed to identify %s"%file_to_copy)
  222.  
  223.         if im.size == (1,1):
  224.             from urllib import FancyURLopener, urlretrieve
  225.             url = FancyURLopener().open("http://www.amazon.com/gp/product/images/%s" % result.Item[f].ASIN).read()
  226.             if url.find('no-img-sm._V47056216_.gif') > 0:
  227.                 self.debug.show('No image available')
  228.                 gutils.warning(self, _("Sorry. This movie is listed but has no poster available at Amazon.com."))
  229.                 return False
  230.             url = gutils.after(url, 'id="imageViewerDiv"><img src="')
  231.             url = gutils.before(url, '" id="prodImage"')
  232.             urlretrieve(url, file_to_copy)
  233.             try:
  234.                 im = Image.open(file_to_copy)
  235.             except IOError:
  236.                 self.debug.show("failed to identify %s"%file_to_copy)
  237.  
  238.         if im.mode != 'RGB': # convert GIFs
  239.             im = im.convert('RGB')
  240.             im.save(file_to_copy, 'JPEG')
  241.         
  242.         handler = self.widgets['big_poster'].set_from_file(file_to_copy)
  243.  
  244.         self.widgets['poster_window'].show()
  245.         self.widgets['poster_window'].move(0,0)
  246.         response = gutils.question(self, \
  247.                 _("Do you want to use this poster instead?"), \
  248.                 1, self.widgets['window'])
  249.         if response == -8:
  250.             self.debug.show("Using fetched poster, updating and removing old one from disk.")
  251.             update_image(self, self.widgets['movie']['number'].get_text().decode('utf-8'), file_to_copy)
  252.         else:
  253.             self.debug.show("Reverting to previous poster and deleting new one from disk.")
  254.             try:
  255.                 os.remove(file_to_copy)
  256.             except:
  257.                 self.debug.show("no permission for %s"%file_to_copy)
  258.  
  259.         self.widgets['poster_window'].hide()
  260.     else:
  261.         gutils.warning(self, _("Sorry. This movie is listed but has no poster available at Amazon.com."))
  262.     reconnect_add_signals(self)
  263.  
  264.